package br.com.werp.regras.documento.controle;

import br.com.werp.regras.documento.integracao.DocumentoDAO;
import br.com.werp.regras.documento.integracao.FabricaDAO;
import br.com.werp.regras.documento.integracao.ImpostoDAO;
import br.com.werp.regras.geral.Algoritimo;
import br.com.werp.regras.geral.Auditoria;
import br.com.werp.regras.geral.FabricaSubSistema;
import br.com.werp.regras.geral.util.BeanUtil;
import br.com.werp.regras.geral.util.Util;
import br.com.werp.regras.geral.vos.documento.DocumentoFinanceiroVO;
import br.com.werp.regras.geral.vos.documento.DocumentoImpostoAgrupadoVO;
import br.com.werp.regras.geral.vos.documento.DocumentoImpostoVO;
import br.com.werp.regras.geral.vos.documento.DocumentoVencimentoVO;
import br.com.werp.regras.geral.vos.tabelas.Agrupamento_documento;
import br.com.werp.regras.geral.vos.tabelas.Documento_imposto;

import java.sql.Connection;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;


/**
 * @author Sobreira
 * Criado em 18/07/2006
 */
public class ControleImposto {
    public void salvarDocumentoImpostoAgrupadoDocFinanceiro(Object key,
        String usuario, DocumentoFinanceiroVO documentoFinanceiroVO,
        DocumentoImpostoVO documentoImpostoVO) throws Exception {
        Auditoria auditoria = FabricaSubSistema.getAuditoria();
        ControleDocumento controleDocumento = new ControleDocumento();

        int docImpId = documentoImpostoVO.getDocm_id();
        controleDocumento.salvarDocumentoFinanceiro(key, documentoImpostoVO,
            usuario);

        ImpostoDAO impostoDAO = FabricaDAO.getImpostoDAO();
        Documento_imposto documento_imposto = new Documento_imposto();
        BeanUtil.copiarVO(documentoImpostoVO, documento_imposto);
        documento_imposto.setDcim_id(documentoImpostoVO.getDocm_id());

        if (docImpId == 0) {
            impostoDAO.inserirVOGenericoSemIdentity(key, documento_imposto);
            auditoria.auditarRecurso(key, usuario, documento_imposto,
                Auditoria.INCLUIR);

            Agrupamento_documento agrupamento_documento =
                new Agrupamento_documento();

            agrupamento_documento.setApdo_doc_agrupado(documentoImpostoVO.getDocm_id());
            agrupamento_documento.setApdo_doc_agrupador(documentoFinanceiroVO.getDocm_id());

            DocumentoDAO documentoDAO = FabricaDAO.getDocumentoDAO();
            documentoDAO.inserirVOGenericoIdentity(key, agrupamento_documento,
                "apdo_id");
            auditoria.auditarRecurso(key, usuario, agrupamento_documento,
                Auditoria.INCLUIR);
        } else {
            impostoDAO.atualizarDocumento_imposto(key, documento_imposto);
            auditoria.auditarRecurso(key, usuario, documento_imposto,
                Auditoria.ALTERAR);
        }

        DocumentoVencimentoVO documentoVencimentoVO =
            new DocumentoVencimentoVO();
        BeanUtil.copiarVO(documentoImpostoVO.getDocumentoVencimentoVO(),
            documentoVencimentoVO);

        ControleVencimento controleVencimento = new ControleVencimento();
        List vencimentos = new ArrayList();
        vencimentos.add(documentoVencimentoVO);

        if (docImpId == 0) {
            /**
             * Enganado o controle de vencimento para este pensar q se
             * trate de um vencimento de tela
             */
            documentoVencimentoVO.setIdVirtual(true);
        }

        controleVencimento.salvarVenciementos(key, documentoImpostoVO,
            vencimentos, usuario);
    }

    public List obterDocumentoImposto(int documentoAgrupador)
        throws Exception {
        ImpostoDAO impostoDAO = FabricaDAO.getImpostoDAO();
        DocumentoImpostoAgrupadoVO agrupadoVO =
            new DocumentoImpostoAgrupadoVO();
        agrupadoVO.setApdo_doc_agrupador(documentoAgrupador);

        List impostos =
            impostoDAO.pesquisarDocumentoImpostoAgrupado(agrupadoVO);
        ControleVencimento controleVencimento = new ControleVencimento();

        for (Iterator iter = impostos.iterator(); iter.hasNext();) {
            DocumentoImpostoVO documentoImpostoVO =
                (DocumentoImpostoVO) iter.next();
            List vencs =
                controleVencimento.obterVencimentos(null,
                    documentoImpostoVO.getDocm_id());
            DocumentoVencimentoVO docVencVO =
                (DocumentoVencimentoVO) Util.get0(vencs);

            documentoImpostoVO.setDocumentoVencimentoVO(docVencVO);
        }

        return impostos;
    }

    public List pesquisarDocumentoImpostoVO(
        DocumentoImpostoVO documentoImpostoVO) throws Exception {
        ImpostoDAO impostoDAO = FabricaDAO.getImpostoDAO();

        return impostoDAO.pesquisarDocumentoImpostoVO(documentoImpostoVO);
    }

    public void removerDocumentoImpostoAgrupadoDocFinanceiro(Object key,
        String usuario, DocumentoFinanceiroVO documentoFinanceiroVO,
        List documentosImposto) throws Exception {
        List documentosImpostoBanco =
            obterDocumentoImposto(documentoFinanceiroVO.getDocm_id());
        Algoritimo algoritimo = FabricaSubSistema.getAlgoritimo();

        List remover =
            algoritimo.gerarListaRemoverIdsReais(documentosImposto,
                documentosImpostoBanco);

        for (Iterator iter = remover.iterator(); iter.hasNext();) {
            DocumentoImpostoVO documentoImpostoVO =
                (DocumentoImpostoVO) iter.next();
            removerDocumentoImpostoVO(key, documentoImpostoVO, usuario);
        }
    }

    private void removerDocumentoImpostoVO(Object key,
        DocumentoImpostoVO documentoImpostoVO, String usuario)
        throws Exception {
        removerVencimentosImpostos(key, documentoImpostoVO, usuario);

        Auditoria auditoria = FabricaSubSistema.getAuditoria();
        Documento_imposto documento_imposto = new Documento_imposto();
        BeanUtil.copiarVO(documentoImpostoVO, documento_imposto);

        ImpostoDAO impostoDAO = FabricaDAO.getImpostoDAO();
        impostoDAO.excluirDocumento_imposto(key, documento_imposto);
        auditoria.auditarRecurso(key, usuario, documento_imposto,
            Auditoria.EXCLUIR);

        ControleDocumento controleDocumento = new ControleDocumento();
        controleDocumento.removerDocumentoFinanceiro(key, usuario,
            documentoImpostoVO);
    }

    private void removerVencimentosImpostos(Object key,
        DocumentoImpostoVO documentoImpostoVO, String usuario)
        throws Exception {
        ControleVencimento controleVencimento = new ControleVencimento();
        controleVencimento.apagarVencimentos(documentoImpostoVO.getDocm_id(),
            key, new ArrayList(), usuario);
    }
}
